复制模块
Python 中,值引用的数据类型可以直接通过赋值的方式进行复制,例如:
python
color1 = 'pink'
color2 = color1
color2 = 'white'
print(color1) #打印出pink
print(color2) #打印出white
color2 复制 color1 之后,修改 color2,不影响 color1。
而地址引用的数据类型直接赋值并不能复制出一个新的数据对象,例如:
python
colors = ['red', 'green', 'blue']
new_colors = colors
new_colors[0] = 'pink'
print(new_colors) #打印出['pink', 'green', 'blue']
print(colors) #打印出['pink', 'green', 'blue']
new_colors 复制 colors 之后,修改 new_colors,会影响 colors。
在这个时候,就需要引入 copy 模块,来实现地址引用对象的复制。
copy
copy(x)
copy 方法,将对象 x 里的元素复制,形成一个新的独立的对象。
python
import copy
colors = ['red', 'green', 'blue']
new_colors = copy.copy(colors)
new_colors[0] = 'pink'
print(new_colors) #打印出['pink', 'green', 'blue']
print(colors) #打印出['red', 'green', 'blue']
现在 new_colors 复制 colors 之后,修改 new_colors,不会影响 colors。
浅复制
但是 copy(x)方法只能实现浅复制,即 x 中内部如果还有地址引用对象时,他们还是被复制了地址,而不是全新的对象。例如:
python
import copy
colors = [
['red', 'green', 'blue'],
['black', 'white', 'gray']
]
new_colors = copy.copy(colors)
new_colors[0][0] = 'pink'
print(new_colors) #打印出[['pink', 'green', 'blue']['black', 'white', 'gray']]
print(colors) #打印出[['pink', 'green', 'blue']['black', 'white', 'gray']]
new_colors 浅复制 colors 之后,修改 new_colors,会影响 colors。
所以,接下来需要用到 deepcopy 方法,来实现深复制。
deepcopy
deepcopy(x)
deepcopy 方法,将对象 x 里的元素深复制,形成一个新的独立的对象。
python
import copy
colors = [
['red', 'green', 'blue'],
['black', 'white', 'gray']
]
new_colors = copy.deepcopy(colors)
new_colors[0][0] = 'pink'
print(new_colors) #打印出[['pink', 'green', 'blue']['black', 'white', 'gray']]
print(colors) #打印出[['red', 'green', 'blue']['black', 'white', 'gray']]
new_colors 浅复制 colors 之后,修改 new_colors,不会影响 colors。